package cn.vetech.sync.elasticsearch.dao;

import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * @author <a href="mailto:wangchao.star@gmail.com">wangchao</a>
 * @version 1.0
 * @since 2017-08-29 10:17:00
 */
@Repository
public interface BaseDao {
    /**
     * 根据主键查询数据
     *
     * @param key          String 主键名字
     * @param value        String 主键书籍
     * @param databaseName String 数据库名
     * @param tableName    String 表名
     * @return Map<String       ,               Object>
     */
    Map<String, Object> selectByPK(@Param("key") String key, @Param("value") Object value,
                                   @Param("databaseName") String databaseName, @Param("tableName") String tableName);

    /**
     * 查询指定主键数据
     *
     * @param key          String 主键名字
     * @param databaseName String 数据库
     * @param tableName    String 数据表
     * @param valueList    List<Object> 主键集合
     * @return List<Map<String,Object>> 数据
     */
    List<Map<String, Object>> selectByPKs(@Param("key") String key, @Param("valueList") List<Object> valueList,
                                          @Param("databaseName") String databaseName, @Param("tableName") String tableName);

    /**
     * @param key          String 主键名字
     * @param databaseName String 数据库
     * @param tableName    String 数据表
     * @param valueList    List<Object> 主键集合
     * @return List<Map<String,Object>> 数据
     */
    List<Map<String, Object>> selectByPKsLockInShareMode(@Param("key") String key,
                                                         @Param("valueList") List<Object> valueList, @Param("databaseName") String databaseName,
                                                         @Param("tableName") String tableName);

    /**
     * 查询数据数量
     *
     * @param databaseName String 数据库
     * @param tableName    String 数据表
     * @return Long 条数
     */
    Long count(@Param("databaseName") String databaseName, @Param("tableName") String tableName);

    /**
     * 查询最大数字类型主键
     *
     * @param key          String 主键名字
     * @param databaseName String 数据库
     * @param tableName    String 数据表
     * @return Long 主键id
     */
    Long selectMaxPK(@Param("key") String key, @Param("databaseName") String databaseName,
                     @Param("tableName") String tableName);

    Long selectMinPK(@Param("key") String key, @Param("databaseName") String databaseName,
                     @Param("tableName") String tableName);

    List<Map<String, Object>> selectByPKInterval(@Param("key") String key, @Param("minPK") long minPK,
                                                 @Param("maxPK") long maxPK, @Param("databaseName") String databaseName,
                                                 @Param("tableName") String tableName);

    /**
     * 查询区间数据
     *
     * @param key          String 主键
     * @param minPK        long 最小主键
     * @param maxPK        long 最大主键
     * @param databaseName String 数据库名
     * @param tableName    String 表名
     * @return List<Map       <       String       ,               Object>>
     */
    List<Map<String, Object>> selectByPKIntervalLockInShareMode(@Param("key") String key, @Param("minPK") long minPK,
                                                                @Param("maxPK") long maxPK, @Param("databaseName") String databaseName,
                                                                @Param("tableName") String tableName);

    /**
     * 分页查询数据
     *
     * @param key          String 主键
     * @param pageStart    long 分页开始
     * @param pageEnd      long 分页结束
     * @param databaseName String 数据库名
     * @param tableName    String 表名
     * @return List<Map       <       String       ,               Object>>
     */
    List<Map<String, Object>> selectDatasLockInShareMode(@Param("key") String key, @Param("pageStart") long pageStart,
                                                         @Param("pageEnd") long pageEnd, @Param("minPK") String minPK, @Param("databaseName") String databaseName,
                                                         @Param("tableName") String tableName);

    /**
     * 根据表查询表字段数据
     * @param table_name
     * @return
     */
    List<Map<String,Object>> getTableData(@Param("table_name") String table_name);
}
